using System;
using System.Collections.Generic;
using System.Globalization;
using System.Threading;
using PortalFolia.Data.Objetos;
using PortalFolia.Repositorio;
using PortalFolia.Servicos.Controladores;

namespace PortalFolia.Servicos
{
    public class Fachada
    {

        #region Atributos

        private static Fachada _unique = null;

        private ControladorComentarios _controladorComentarios;
        private ControladorEventos _controladorEventos;
        private ControladorTipoIngresso _controladorTipoIngresso;
        private ControladorUsuarios _controladorUsuarios;
        private ControladorVendas _controladorVendas;

        #endregion

        #region GetInstacia Fachada

        public static Fachada GetInstancia()
        {
            if (_unique == null)
            {
                _unique = new Fachada();
            }

            return _unique;
        }

        #endregion

        #region Construtor

        public Fachada()
        {
            Thread.CurrentThread.CurrentCulture = new CultureInfo("pt-BR");

            GerenciadorBD.Instance.SessaoAtual().Clear();

            _controladorVendas = new ControladorVendas();
            _controladorUsuarios = new ControladorUsuarios();
            _controladorTipoIngresso = new ControladorTipoIngresso();
            _controladorEventos = new ControladorEventos();
            _controladorComentarios = new ControladorComentarios();

        }

        #endregion

        #region Usuarios

        public Usuario Inserir(Usuario usuario)
        {
            Usuario usuariotmp;
            GerenciadorBD.Instance.IniciarTransacao();
            try
            {
                usuariotmp = _controladorUsuarios.Inserir(usuario);
                GerenciadorBD.Instance.ConfirmarTransacao();
            }
            catch (Exception)
            {
                GerenciadorBD.Instance.CancelarTransacao();
                usuariotmp = null;
                throw;
            }
            return usuariotmp;
        
        }

        public Usuario Atualizar(Usuario usuario)
        {
            Usuario usuariotmp;
            GerenciadorBD.Instance.IniciarTransacao();
            try
            {
                usuariotmp = _controladorUsuarios.Atualizar(usuario);
                GerenciadorBD.Instance.ConfirmarTransacao();
            }
            catch (Exception)
            {
                GerenciadorBD.Instance.CancelarTransacao();
                usuariotmp = null;
                throw;
            }
            return usuariotmp;
        }

        public void ExcluirUsuario(int id)
        {
            GerenciadorBD.Instance.IniciarTransacao();
            try
            {
                _controladorUsuarios.Excluir(id);
                GerenciadorBD.Instance.ConfirmarTransacao();
            }
            catch (Exception)
            {
                GerenciadorBD.Instance.CancelarTransacao();
                throw;
            }
           
        }

        public IList<Usuario> ObterTodosUsuarios()
        {
            return _controladorUsuarios.ObterTodos();
        }

        public Usuario ObterUsuarioPorId(int id)
        {
            return _controladorUsuarios.ObterPorId(id);
        }

        public Usuario ObterUsuarioPorEmail(string email)
        {
            return _controladorUsuarios.ObterUsuarioPorEmail(email);
        }

        public bool VerificarEmail(string email)
        {
            return _controladorUsuarios.VerificarEmail(email);
        }

        public bool VerificarLogin(string login)
        {
            return _controladorUsuarios.VerificarLogin(login);
        }

        public Usuario Logar(string nomeUsuario)
        {
            return _controladorUsuarios.Logar(nomeUsuario);
        }

        #endregion

        #region Eventos

        public Eventos Inserir(Eventos eventos)
        {
            Eventos eventostmp;
            GerenciadorBD.Instance.IniciarTransacao();
            try
            {
                eventostmp = _controladorEventos.Inserir(eventos);
                GerenciadorBD.Instance.ConfirmarTransacao();
            }
            catch (Exception)
            {
                GerenciadorBD.Instance.CancelarTransacao();
                eventostmp = null;
                throw;
            }
            return eventostmp;
        }

        public Eventos Atualizar(Eventos eventos)
        {
            Eventos eventostmp;
            GerenciadorBD.Instance.IniciarTransacao();
            try
            {
                eventostmp = _controladorEventos.Atualizar(eventos);
                GerenciadorBD.Instance.ConfirmarTransacao();
            }
            catch (Exception)
            {
                GerenciadorBD.Instance.CancelarTransacao();
                eventostmp = null;
                throw;
            }
            return eventostmp;
        }

        public void ExcluirEvento(int id)
        {
            GerenciadorBD.Instance.IniciarTransacao();
            try
            {
                _controladorEventos.Excluir(id);
                GerenciadorBD.Instance.ConfirmarTransacao();
            }
            catch (Exception)
            {
                GerenciadorBD.Instance.CancelarTransacao();
                throw;
            }
            
        }

        public IList<Eventos> ObterTodosEventos()
        {
            return _controladorEventos.ObterTodos();
        }

        public Eventos ObterEventoPorId(int id)
        {
            return _controladorEventos.ObterPorId(id);
        }

        #endregion

        #region TipoIngresso

        public TipoIngresso Inserir(TipoIngresso tipoIngresso)
        {
            TipoIngresso tipoIngressotmp;
            GerenciadorBD.Instance.IniciarTransacao();
            try
            {
                tipoIngressotmp = _controladorTipoIngresso.Inserir(tipoIngresso);
                GerenciadorBD.Instance.ConfirmarTransacao();
            }
            catch (Exception)
            {
                GerenciadorBD.Instance.CancelarTransacao();
                tipoIngressotmp = null;
                throw;
            }
            return tipoIngressotmp;
        }

        public TipoIngresso Atualizar(TipoIngresso tipoIngresso)
        {
            TipoIngresso tipoIngressotmp;
            GerenciadorBD.Instance.IniciarTransacao();
            try
            {
                tipoIngressotmp = _controladorTipoIngresso.Atualizar(tipoIngresso);
                GerenciadorBD.Instance.ConfirmarTransacao();
            }
            catch (Exception)
            {
                GerenciadorBD.Instance.CancelarTransacao();
                tipoIngressotmp = null;
                throw;
            }
            return tipoIngressotmp;
        }

        public void ExcluirTipoIngresso(int id)
        {
            GerenciadorBD.Instance.IniciarTransacao();
            try
            {
                _controladorTipoIngresso.Excluir(id);
                GerenciadorBD.Instance.ConfirmarTransacao();
            }
            catch (Exception)
            {
                GerenciadorBD.Instance.CancelarTransacao();
                throw;
            }
        }

        public IList<TipoIngresso> ObterTodosTiposIngresso()
        {
            return _controladorTipoIngresso.ObterTodos();
        }

        public TipoIngresso ObterTipoIngressoPorId(int id)
        {
            return _controladorTipoIngresso.ObterPorId(id);
        }

        #endregion

        #region Vendas

        public Vendas Inserir(Vendas vendas)
        {
            Vendas vendastmp;
            GerenciadorBD.Instance.IniciarTransacao();
            try
            {
                vendastmp = _controladorVendas.Inserir(vendas);
                GerenciadorBD.Instance.ConfirmarTransacao();
            }
            catch (Exception)
            {
                GerenciadorBD.Instance.CancelarTransacao();
                vendastmp = null;
                throw;
            }
            return vendastmp;
        }

        public Vendas Atualizar(Vendas vendas)
        {
            Vendas vendastmp;
            GerenciadorBD.Instance.IniciarTransacao();
            try
            {
                vendastmp = _controladorVendas.Atualizar(vendas);
                GerenciadorBD.Instance.ConfirmarTransacao();
            }
            catch (Exception)
            {
                GerenciadorBD.Instance.CancelarTransacao();
                vendastmp = null;
                throw;
            }
            return vendastmp;
        }

        public void ExcluirVendas(int id)
        {
            GerenciadorBD.Instance.IniciarTransacao();
            try
            {
                _controladorVendas.Excluir(id);
                GerenciadorBD.Instance.ConfirmarTransacao();
            }
            catch (Exception)
            {
                GerenciadorBD.Instance.CancelarTransacao();
                throw;
            }
            
        }

        public IList<Vendas> ObterTodasVendas()
        {
            return _controladorVendas.ObterTodos();
        }

        public Vendas ObterVendasPorId(int id)
        {
            return _controladorVendas.ObterPorId(id);
        }

        #endregion

        #region Comentarios

        public Comentario Inserir(Comentario comentario)
        {
            Comentario comentariotmp;
            GerenciadorBD.Instance.IniciarTransacao();
            try
            {
                comentariotmp = _controladorComentarios.Inserir(comentario);
                GerenciadorBD.Instance.ConfirmarTransacao();
            }
            catch (Exception)
            {
                GerenciadorBD.Instance.CancelarTransacao();
                comentariotmp = null;
                throw;
            }
            return comentariotmp;
        }

        public Comentario Atualizar(Comentario comentario)
        {
            Comentario comentariotmp;
            GerenciadorBD.Instance.IniciarTransacao();
            try
            {
                comentariotmp =  _controladorComentarios.Atualizar(comentario);
                GerenciadorBD.Instance.ConfirmarTransacao();
            }
            catch (Exception)
            {
                GerenciadorBD.Instance.CancelarTransacao();
                comentariotmp = null;
                throw;
            }
            return comentariotmp;
        }

        public void ExcluirComentarios(int id)
        {
            GerenciadorBD.Instance.IniciarTransacao();
            try
            {
                _controladorComentarios.Excluir(id);
                GerenciadorBD.Instance.ConfirmarTransacao();
            }
            catch (Exception)
            {
                GerenciadorBD.Instance.CancelarTransacao();
                throw;
            }
        }

        public IList<Comentario> ObterTodosComentarios()
        {
            return _controladorComentarios.ObterTodos();
        }

        public Comentario ObterComentarioPorId(int id)
        {
            return _controladorComentarios.ObterPorId(id);
        }

        #endregion

    }
}